package com.tp7567.domain;

import java.io.Serializable;
import java.util.List;
import com.google.common.collect.Lists;

/**
 * 
 * @author Maxi Rosson
 */
@SuppressWarnings("serial")
public class Patient implements Serializable {
	
	public enum PG implements Sintoma {
		PGF("Femenino"),
		PGM("Masculino");
		
		private String name;
		
		private PG(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Genero";
		}
	}
	
	// Alteración de las habilidades comunicativas
	public enum SA implements Sintoma {
		SAN("No"),
		SAL("Leve"),
		SAA("Alta");
		
		private String name;
		
		private SA(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Alteracion de las Habilidades Comunicativas";
		}
	}
	
	// Desarrollo del lenguaje oral
	public enum SB implements Sintoma {
		SBPFU("Problemas Funcionales"),
		SBPFO("Problemas Formales"),
		SBPFUYFO("Problemas funcionales y formales"),
		SBSL("Sin lenguaje");
		
		private String name;
		
		private SB(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Desarrollo del Lenguaje Oral";
		}
	}
	
	// Presencia de comportamientos, intereses y actividades estereotipadas
	public enum SC implements Sintoma {
		SCNO("No"),
		SCPO("Pocas"),
		SCME("Medio"),
		SCMU("Muchas");
		
		private String name;
		
		private SC(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Comportamiento Estereotipado";
		}
	}
	
	// Dificultades en el desarrollo de vínculos
	public enum SD implements Sintoma {
		SDN("No"),
		SDS("Si");
		
		private String name;
		
		private SD(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Dificultades en el Desarrollo de Vinculos";
		}
	}
	
	// Retraso cognitivo
	public enum SE implements Sintoma {
		SE_50("Menos de 50"),
		SE50_70("Entre 50 y 70"),
		SE_70("Mayor a 70");
		
		private String name;
		
		private SE(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Retraso Cognitivo";
		}
	}
	
	// Adhesión a conductas ritualizadas
	public enum SF implements Sintoma {
		SFN("No"),
		SFS("Si");
		
		private String name;
		
		private SF(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Adhesión a Conductas Ritualizadas";
		}
	}
	
	// Conductas de autolisis
	public enum SG implements Sintoma {
		SGN("No"),
		SGS("Si");
		
		private String name;
		
		private SG(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Conductas de Autolisis";
		}
	}
	
	// Perdidas de habilidades previamente adquiridas
	public enum SH implements Sintoma {
		SHNO("No"),
		SHPO("Pocas"),
		SHME("Medio"),
		SHMU("Muchas");
		
		private String name;
		
		private SH(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Perdida Habilidades previamente adquiridas";
		}
	}
	
	// Manifestación a edad temprana
	public enum SI implements Sintoma {
		SI_3("Menos de los 3 años"),
		SI3_5("Entre los 3 y 5 años"),
		SI5_10("Entre los 5 y 10 años");
		
		private String name;
		
		private SI(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Manifestacion a Edad Temprana";
		}
	}
	
	// Desarrollo psicomotor
	public enum SJ implements Sintoma {
		SJDL("Dificultades Leves"),
		SJGD("Grandes Dificultades"),
		SJSD("Sin dificultades");
		
		private String name;
		
		private SJ(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Desarrollo Psicomotor";
		}
	}
	
	// Control intestinal o vesical
	public enum SK implements Sintoma {
		SKN("No"),
		SKS("Si");
		
		private String name;
		
		private SK(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Control Intestinal o vesical";
		}
	}
	
	// Ausencia de la tendencia espontánea a compartir disfrutes
	public enum SL implements Sintoma {
		SLN("No"),
		SLS("Si");
		
		private String name;
		
		private SL(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Ausencia de la tendencia a Compartir Disfrutes";
		}
	}
	
	// Alteración del uso de los gestos reguladores de la interacción social
	public enum SM implements Sintoma {
		SMN("No"),
		SML("Leve"),
		SMA("Alta");
		
		private String name;
		
		private SM(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Gestos Reguladores";
		}
	}
	
	// Presencia de habilidades inusuales
	public enum SN implements Sintoma {
		SNN("No"),
		SNS("Si");
		
		private String name;
		
		private SN(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Habilidades Inusuales";
		}
	}
	
	// Ausencia del juego realista espontáneo
	public enum SO implements Sintoma {
		SON("No"),
		SOS("Si");
		
		private String name;
		
		private SO(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Ausencia del juego realista espontaneo";
		}
	}
	
	// Tolerancia al dolor
	public enum SP implements Sintoma {
		SPN("No"),
		SPS("Si");
		
		private String name;
		
		private SP(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public String getType() {
			return "Tolerancia al dolor";
		}
	}
	
	private PG pg;
	private SA sa;
	private SB sb;
	private SC sc;
	private SD sd;
	private SE se;
	private SF sf;
	private SG sg;
	private SH sh;
	private SI si;
	private SJ sj;
	private SK sk;
	private SL sl;
	private SM sm;
	private SN sn;
	private SO so;
	private SP sp;
	
	private AutismLevel autismLevel;
	private List<AutismLevel> availableAutismLevels;
	
	public Patient() {
		autismLevel = AutismLevel.NONE;
		resetAvailables();
	}
	
	public void resetAvailables() {
		availableAutismLevels = Lists.newArrayList(AutismLevel.values());
		availableAutismLevels.remove(AutismLevel.NONE);
	}
	
	public void removeAvailableAutismLevel(String autismLevel) {
		availableAutismLevels.remove(AutismLevel.findByLevelKey(autismLevel));
	}
	
	public List<Sintoma> getSintomas() {
		List<Sintoma> sintomas = Lists.newArrayList();
		if (pg != null) {
			sintomas.add(pg);
		}
		if (sa != null) {
			sintomas.add(sa);
		}
		if (sb != null) {
			sintomas.add(sb);
		}
		if (sc != null) {
			sintomas.add(sc);
		}
		if (sd != null) {
			sintomas.add(sd);
		}
		if (se != null) {
			sintomas.add(se);
		}
		if (sf != null) {
			sintomas.add(sf);
		}
		if (sg != null) {
			sintomas.add(sg);
		}
		if (sh != null) {
			sintomas.add(sh);
		}
		if (si != null) {
			sintomas.add(si);
		}
		if (sj != null) {
			sintomas.add(sj);
		}
		if (sk != null) {
			sintomas.add(sk);
		}
		if (sl != null) {
			sintomas.add(sl);
		}
		if (sm != null) {
			sintomas.add(sm);
		}
		if (sn != null) {
			sintomas.add(sn);
		}
		if (so != null) {
			sintomas.add(so);
		}
		if (sp != null) {
			sintomas.add(sp);
		}
		return sintomas;
	}
	
	/**
	 * @return the autismLevel
	 */
	public AutismLevel getAutismLevel() {
		return autismLevel;
	}
	
	/**
	 * @param autismLevel the autismLevel to set
	 */
	public void setAutismLevel(String autismLevel) {
		this.autismLevel = AutismLevel.findByLevelKey(autismLevel);
	}
	
	/**
	 * @return the habilidadesComunicativas
	 */
	public SA getSa() {
		return sa;
	}
	
	/**
	 * @param sa the habilidadesComunicativas to set
	 */
	public void setSa(SA sa) {
		this.sa = sa;
	}
	
	/**
	 * @return the lenguajeOral
	 */
	public SB getSb() {
		return sb;
	}
	
	/**
	 * @param sb the lenguajeOral to set
	 */
	public void setSb(SB sb) {
		this.sb = sb;
	}
	
	/**
	 * @return the comportamientoEstereotipado
	 */
	public SC getSc() {
		return sc;
	}
	
	/**
	 * @param sc the comportamientoEstereotipado to set
	 */
	public void setSc(SC sc) {
		this.sc = sc;
	}
	
	/**
	 * @return the desarrolloVinculos
	 */
	public SD getSd() {
		return sd;
	}
	
	/**
	 * @param sd the desarrolloVinculos to set
	 */
	public void setSd(SD sd) {
		this.sd = sd;
	}
	
	/**
	 * @return the retrasoCognitivo
	 */
	public SE getSe() {
		return se;
	}
	
	/**
	 * @param retrasoCognitivo the retrasoCognitivo to set
	 */
	public void setSe(SE retrasoCognitivo) {
		se = retrasoCognitivo;
	}
	
	/**
	 * @return the conductasRitualizadas
	 */
	public SF getSf() {
		return sf;
	}
	
	/**
	 * @param conductasRitualizadas the conductasRitualizadas to set
	 */
	public void setSf(SF conductasRitualizadas) {
		sf = conductasRitualizadas;
	}
	
	/**
	 * @return the conductasAutolisis
	 */
	public SG getSg() {
		return sg;
	}
	
	/**
	 * @param conductasAutolisis the conductasAutolisis to set
	 */
	public void setSg(SG conductasAutolisis) {
		sg = conductasAutolisis;
	}
	
	/**
	 * @return the perdidaHabilidades
	 */
	public SH getSh() {
		return sh;
	}
	
	/**
	 * @param perdidaHabilidades the perdidaHabilidades to set
	 */
	public void setSh(SH perdidaHabilidades) {
		sh = perdidaHabilidades;
	}
	
	/**
	 * @return the manifestaciónEdadTemprana
	 */
	public SI getSi() {
		return si;
	}
	
	/**
	 * @param manifestaciónEdadTemprana the manifestaciónEdadTemprana to set
	 */
	public void setSi(SI manifestaciónEdadTemprana) {
		si = manifestaciónEdadTemprana;
	}
	
	/**
	 * @return the desarrolloPsicomotor
	 */
	public SJ getSj() {
		return sj;
	}
	
	/**
	 * @param desarrolloPsicomotor the desarrolloPsicomotor to set
	 */
	public void setSj(SJ desarrolloPsicomotor) {
		sj = desarrolloPsicomotor;
	}
	
	/**
	 * @return the controlIntestinal
	 */
	public SK getSk() {
		return sk;
	}
	
	/**
	 * @param controlIntestinal the controlIntestinal to set
	 */
	public void setSk(SK controlIntestinal) {
		sk = controlIntestinal;
	}
	
	/**
	 * @return the compartirDisfrutes
	 */
	public SL getSl() {
		return sl;
	}
	
	/**
	 * @param compartirDisfrutes the compartirDisfrutes to set
	 */
	public void setSl(SL compartirDisfrutes) {
		sl = compartirDisfrutes;
	}
	
	/**
	 * @return the gestosReguladores
	 */
	public SM getSm() {
		return sm;
	}
	
	/**
	 * @param gestosReguladores the gestosReguladores to set
	 */
	public void setSm(SM gestosReguladores) {
		sm = gestosReguladores;
	}
	
	/**
	 * @return the habilidadesInusuales
	 */
	public SN getSn() {
		return sn;
	}
	
	/**
	 * @param habilidadesInusuales the habilidadesInusuales to set
	 */
	public void setSn(SN habilidadesInusuales) {
		sn = habilidadesInusuales;
	}
	
	/**
	 * @return the juegoRealistaEspontaneo
	 */
	public SO getSo() {
		return so;
	}
	
	/**
	 * @param juegoRealistaEspontaneo the juegoRealistaEspontaneo to set
	 */
	public void setSo(SO juegoRealistaEspontaneo) {
		so = juegoRealistaEspontaneo;
	}
	
	/**
	 * @return the toleranciaDolor
	 */
	public SP getSp() {
		return sp;
	}
	
	/**
	 * @param toleranciaDolor the toleranciaDolor to set
	 */
	public void setSp(SP toleranciaDolor) {
		sp = toleranciaDolor;
	}
	
	/**
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Patient [habilidadesComunicativas=" + sa + ", lenguajeOral=" + sb + ", comportamientoEstereotipado="
				+ sc + ", desarrolloVinculos=" + sd + ", retrasoCognitivo=" + se + ", conductasRitualizadas=" + sf
				+ ", conductasAutolisis=" + sg + ", perdidaHabilidades=" + sh + ", manifestaciónEdadTemprana=" + si
				+ ", desarrolloPsicomotor=" + sj + ", controlIntestinal=" + sk + ", compartirDisfrutes=" + sl
				+ ", gestosReguladores=" + sm + ", habilidadesInusuales=" + sn + ", juegoRealistaEspontaneo=" + so
				+ ", toleranciaDolor=" + sp + ", autismLevel=" + autismLevel + "]";
	}
	
	/**
	 * @return the genero
	 */
	public PG getPg() {
		return pg;
	}
	
	/**
	 * @param genero the genero to set
	 */
	public void setPg(PG genero) {
		pg = genero;
	}
	
	/**
	 * @return the availableAutismLevels
	 */
	public List<AutismLevel> getAvailableAutismLevels() {
		return availableAutismLevels;
	}
	
}
